package com.mjk.common.util;

import java.io.ByteArrayOutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class StringUtils {
	/**
	 * 功能：拼接字符串，用于支付加密
	 * @param mark 间隔符
	 * @param str 字符串
	 * @return
	 */
	public static String isAddStrings(String mark,String... str) {
		String strs = "";
		for (String s : str) {
			strs += s+mark;
		}
		strs = strs.substring(0, strs.length()-mark.length());
		return strs;
	}
	/**
	 * 功能：不定长参数,其中一个参数为null或空则返回true,负责返回false
	 * 
	 * @param str
	 * @return boolean
	 */
	public static boolean isEmpty(String... str) {
		for (String s : str) {
			if (StringUtils.isEmpty(s)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 功能：不定长参数,其中一个参数为null或空或为空格字符串则返回true,负责返回false
	 * 
	 * @param str
	 * @return boolean
	 */
	public static boolean isBlank(String... str) {
		if(null == str){
			return true;
		}
			for (String s : str) {
				if (StringUtils.isBlank(s))
					return true;
			}
		
		return false;
	}

	/**
	 * 功能：不定长参数,其中一个参数为null或空或为空格字符串则返回true,负责返回false
	 * 
	 * @param str
	 * @return boolean
	 */
	public static boolean isNotBlank(String... str) {
		return !isBlank(str);
	}

	/**
	 * 功能：判断字符串是否是数值. 默认允许有正负号,默认允许有小数点
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNumeric(String str) {
		boolean sign = true;
		int point_bef = Integer.MAX_VALUE;// 小数点前有几位
		int point_aft = Integer.MAX_VALUE;// 小数点后有几位
		return isNumeric(str, sign, point_bef, point_aft);
	}

	/**
	 * 功能：判断字符串是否是数值
	 * 
	 * @param str
	 * @param sign
	 *            是否允许有正负号
	 * @param point
	 *            是否允许有小数点
	 * @return
	 */
	public static boolean isNumeric(String str, boolean sign, boolean point) {
		int point_bef = Integer.MAX_VALUE;// 小数点前有几位
		int point_aft = Integer.MAX_VALUE;// 小数点后有几位
		if (!point)
			point_aft = 0;

		return isNumeric(str, sign, point_bef, point_aft);
	}

	/**
	 * 功能：判断字符串是否是数值
	 * 
	 * @param str
	 * @param sign
	 *            是否允许有正负号
	 * @param point_bef
	 *            精度,小数点前有几位
	 * @param point_aft
	 *            精度,小数点后有几位,如果为0,则为整数
	 * 
	 * @return
	 */
	public static boolean isNumeric(String str, boolean sign, int point_bef,
			int point_aft) {
		if (StringUtils.isBlank(str)) {
			return false;
		}
		boolean point = true;// 是否允许小数点
		if (point_aft == 0) {
			point = false;// 不允许有小数点
		} else {
			point = true;
		}
		StringBuffer pat = new StringBuffer();
		if (sign) {
			pat.append("[+|-]?");
		}
		if (point_bef == 0) {
			pat.append("[0]");
		} else {
			pat.append("[0-9]{1,");
			pat.append(point_bef);
			pat.append("}");
		}
		if (point && str.indexOf(".") != -1) {// 允许小数点,并且有小数点
			pat.append("[.]");
			pat.append("[0-9]{1,");// 小数点后必须有一位
			pat.append(point_aft);
			pat.append("}");
		}
		Pattern pattern = Pattern.compile(pat.toString());
		if (!pattern.matcher(str).matches()) {
			return false;
		} else {// 排除如00.1,返回false
			if (str.indexOf(".") != -1
					&& str.substring(0, str.indexOf(".")).length() > 1
					&& Integer.valueOf(str.substring(0, str.indexOf("."))) == 0) {
				return false;
			} else {
				return true;
			}
		}
	}

	/**
	 * 功能：查看字符串是否有这个子字符串
	 * 
	 * @param str
	 *            主字符串
	 * @param substr
	 *            字字符串
	 * @return
	 */
	public static boolean hasSubstring(String str, String substr) {
		if (str == null || substr == null)
			return false;
		int strLen = str.length();
		int substrLen = substr.length();
		for (int i = 0; (i + substrLen) <= strLen; i++) {
			if (str.substring(i, i + substrLen).equalsIgnoreCase(substr)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 功能：验证是否是正确的手机号
	 * 
	 * @param mobile
	 * @return
	 */
	public static boolean isMobile(String mobile) {
//		if (StringUtils.isBlank(mobile))
//			return false;
//		return Pattern.matches("^(1[3|5|8])\\d{9}$", mobile);
		Pattern pattern = Pattern.compile("1\\d{10}"); 
		Matcher isNum = pattern.matcher(mobile);
		   if( !isNum.matches() ){
		       return false; 
		   } 
		   return true; 
	}

	/**
	 * 功能：字符串不以"/"结尾，则在串尾加"/"
	 * 
	 * @param s
	 * @return
	 */
	public static String addSlashInEnd(String s) {
		if (s != null) {
			s = s.trim();
			if (!s.endsWith("/")) {
				s = s + "/";
			}
		} else {
			s = "";
		}
		return s;
	}

	/**
	 * 功能：字符串如果以/开头,则去掉第一个/
	 * 
	 * @param s
	 * @return
	 */
	public static String delSlashInEnd(String s) {
		if (s != null) {
			s = s.trim();
			if (s.startsWith("/")) {
				s = s.substring(1, s.length());
			}
		} else {
			s = "";
		}
		return s;
	}

	/**
	 * 功能：字符串不以"/"结尾，则在串尾加"/";字符串如果以/开头,则去掉第一个/
	 * 
	 * @return
	 */
	public static String dealSlash(String s) {
		if (s != null) {
			s = s.trim();
			if (!s.endsWith("/")) {
				s = s + "/";
			}
			if (s.startsWith("/")) {
				s = s.substring(1, s.length());
			}
		} else {
			s = "";
		}
		return s;

	}

	/**
	 * 功能：传入一个数字类型的参数，返回一个小数点后两位的小数
	 * 
	 * @param parm
	 */
	public static String converDouble(String parm) {
		if (isNumeric(parm, false, true)) {
			if (parm.indexOf(".") >= 0) {
				String value = parm.substring(parm.indexOf(".") + 1);
				if (value.length() == 1) {
					return parm + "0";
				} else if (value.length() > 2) {
					return parm.substring(0, parm.indexOf(".") + 1)
							+ value.substring(0, 2);
				} else {
					return parm;
				}
			} else {
				return parm + ".00";
			}
		}
		return null;
	}

	
	/**
	 * @Description：将请求url路径返回字符串
	 * @param urlstr
	 * @return
	 */
	public static String urlToString(String urlstr) {
		try {
			URL url = new URL(urlstr);
			URLConnection connection = url.openConnection();
			byte[] btArr = null;
			if (connection != null && connection.getInputStream() != null) {
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				int b = 0;
				b = connection.getInputStream().read();
				while (b != -1) {
					baos.write(b);
					b = connection.getInputStream().read();
				}
				btArr = baos.toByteArray();
			}
			if (btArr != null) {
				String ret = new String(btArr, "UTF-8");
				return ret;
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * @Description：字符数组转 字符串 “，”隔开 {"SDF","345"} == "SDF,345"
	 * @param
	 * @return
	 */
	public static String arryTOString(String[] data) {
		String returnData = "";
		if (null != data && data.length > 0) {
			for (String temp : data) {
				returnData = temp + "," + returnData;
			}
			returnData = returnData.substring(0, returnData.length() - 1);
		}
		return returnData;
	}

	/**
	 * @Description：取文件名的后缀
	 * @param
	 * @return
	 */
	public static String getFileSuffix(String file_name) {
		String returnData = "";
		if (!StringUtils.isBlank(file_name)) {
			int len = file_name.lastIndexOf(".");
			if (len > 0) {
				returnData = file_name.substring(len + 1, file_name.length());
			}
		}
		return returnData;
	}

	/**
	 * @Description：验证用户名是否合法,数字或字母或下划线
	 * @param userId
	 * @return
	 */
	public static boolean validateUserId(String userId) {
		if (userId == null) {
			return false;
		}
		String regex = "^[a-zA-Z0-9_]{1,32}$";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(userId);
		return m.matches();
	}
	public static int toInt(String str){
		try{
			return Integer.valueOf(str).intValue();
		}catch (Exception e) {
			// : handle exception
			e.printStackTrace();
		}
		return 0;
	}
	
	/**
	 * 获取时间加上四位随机数的单号
	* @Title: getOuterNoticeSn
	* @Description:   
	* @param @return
	* @return String
	* @user  dangrenning
	* @date 2014-12-30下午2:55:21
	 */
	public static String getRandomNumber(Integer num){
		 Random random = new Random(); 
		 StringBuffer sb = new StringBuffer();
		 for(int i = 0;i<num;i++){
			 sb.append(random.nextInt(10));
		 }
		 return sb.toString();
	}
	
	/**
	 * 处理用户名，取用户名的第一个字加**
	* @Title: accessName
	* @Description:   
	* @param @param userName
	* @param @return
	* @return String
	* @user  dangrenning
	* @date 2015-1-19下午3:34:04
	 */
	public static String accessName(String userName){
		if(userName.length()>0){
			return userName.substring(0,1)+"**";
		}else{
			return "**";
		}
	}
	
	/**
	 * 处理身份证，显示身份证号前四位、后四位，中间用*号代替
	* @Title: accessIdCard
	* @Description:   
	* @param @return
	* @return String
	* @user  dangrenning
	* @date 2015-2-3下午3:12:33
	 */
	public static String accessIdCard(String idCarNo){
		StringBuffer sb = new StringBuffer(idCarNo.substring(0,4));
		for(int i =0;i<idCarNo.length()-8;i++){
			sb.append("*");
		}
		sb.append(idCarNo.substring(idCarNo.length()-4,idCarNo.length()));
		return sb.toString();
	}
}
